есть_рейс(мос,ект).
есть_рейс(мос,новосиб).
есть_рейс(спб,новосиб).
есть_рейс(спб,сочи).
есть_рейс(спб,минск).
есть_рейс(ект,сочи).
есть_рейс(сочи,киев).
есть_рейс(минск,новосиб).
есть_рейс(минск,киев).

% Наличие рейсов между двумя городами в обоих направлениях
есть_рейсы(X, Y) :- есть_рейс(X, Y); есть_рейс(Y, X).
% Возможность попадания из города X в город Y
связаны(X, Y) :- связаны(X, Y, []).
% Связаны с учетом посещенных городов для проверки циклов
связаны(X, Y, _) :- есть_рейсы(X, Y).
связаны(X, Y, Visited) :-
    есть_рейсы(X, Z),
    \+ member(Z, Visited), % Проверка на посещение города, чтобы избежать циклов
    связаны(Z, Y, [X|Visited]).

